package cn.iocoder.yudao.module.trade.aftersale.service;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.trade.aftersale.dal.dataobject.AfterSaleDO;
import cn.iocoder.yudao.module.trade.aftersale.vo.*;

import java.util.List;

/**
 * 售后订单 Service 实现类
 *
 * @author 芋道源码
 */
public interface AfterSaleService {

    /**
     * 【管理员】获得售后订单分页
     *
     * @param pageReqVO 分页查询
     * @return 售后订单分页
     */
    PageResult<AfterSaleDO> getAfterSalePage(AfterSalePageReqVO pageReqVO);

    /**
     * 【买家】获得售后订单分页
     *
     * @param userId    用户编号
     * @param pageParam 分页参数
     * @return 售后订单分页
     */
    PageResult<AfterSaleDO> getAfterSalePage(Long userId, AppAfterSalePageReqVO pageParam);

    /**
     * 【卖家】获得售后订单分页
     *
     * @param shopId 店铺编号
     * @param pageParam 分页参数
     * @return 售后订单分页
     */
    PageResult<AfterSaleDO> getSellerAfterSalePage(Long shopId, AppAfterSalePageReqVO pageParam);

    /**
     * 【买家】获得售后单（单个产品）
     *
     * @param userId 用户编号
     * @param id     售后编号
     * @return 售后订单
     */
    AfterSaleDO getAfterSale(Long userId, Long id);

    /**
     * 【买家】获得售后单（整单）
     *
     * @param userId 用户编号
     * @param orderId 订单编号
     * @return 售后订单
     */
    List<AfterSaleDO> getAfterSaleByOrderId(Long userId, Long orderId);

    /**
     * 【卖家】获得售后单（单个产品）
     *
     * @param shopId 店铺编号
     * @param id     售后编号
     * @return 售后订单
     */
    AfterSaleDO getSellerAfterSale(Long shopId, Long id);

    /**
     * 【卖家】获得售后单（整单）
     *
     * @param shopId 店铺编号
     * @param orderId 订单编号
     * @return 售后订单
     */
    List<AfterSaleDO> getSellerAfterSaleByOrderId(Long shopId, Long orderId);

    /**
     * 获得售后单
     *
     * @param id 售后编号
     * @return 售后订单
     */
    AfterSaleDO getAfterSale(Long id);

    /**
     * 【买家】创建售后订单
     *
     * @param userId      用户编号
     * @param createReqVO 创建 Request 信息
     * @return 售后编号
     */
    Long createAfterSale(Long userId, AppAfterSaleCreateReqVO createReqVO);

    /**
     * 【卖家】同意售后订单
     *
     * @param shopId      店铺编号
     * @param reqVO Request 信息
     */
    void agreeAfterSale(Long shopId, AfterSaleAgreeReqVO reqVO);

    /**
     * 【卖家】拒绝售后订单
     *
     * @param shopId      店铺编号
     * @param reqVO 审批 Request 信息
     */
    void disagreeAfterSale(Long shopId, AfterSaleDisagreeReqVO reqVO);

    /**
     * 【买家】退回货物
     *
     * @param userId        用户编号
     * @param deliveryReqVO 退货 Request 信息
     */
    void deliveryAfterSale(Long userId, AppAfterSaleDeliveryReqVO deliveryReqVO);

    /**
     * 【卖家】退货确认收货（单个产品）
     *
     * @param shopId      店铺编号
     * @param id     售后编号
     */
    void receiveAfterSale(Long shopId, Long id);

    /**
     * 【卖家】退货确认收货（整单）
     *
     * @param shopId      店铺编号
     * @param orderId     订单编号
     */
    void receiveAfterSaleByOrder(Long shopId, Long orderId);

    /**
     * 【卖家】退货拒绝收货
     *
     * @param shopId      店铺编号
     * @param refuseReqVO 拒绝收货 Request 信息
     */
    void refuseAfterSale(Long shopId, AfterSaleRefuseReqVO refuseReqVO);

    /**
     * 【平台】确认退款（单个产品）
     *
     * @param id     售后编号
     */
    void refundAfterSale(Long id);

    /**
     * 【平台】确认退款（整单）
     *
     * @param orderId     订单编号
     */
    void refundAfterSaleByOrder(Long orderId);

    /**
     * 【系统】更新为已退款
     *
     * @param refundNo 退款单号
     */
    void updateAfterSaleRefunded(String refundNo);

    /**
     * 【买家】取消售后（单个产品）
     *
     * @param userId 用户编号
     * @param id     售后编号
     */
    void cancelAfterSale(Long userId, Long id);

    /**
     * 【买家】取消售后（整单）
     *
     * @param userId 用户编号
     * @param orderId 订单编号
     */
    void cancelAfterSaleByOrder(Long userId, Long orderId);

    /**
     * 【买家】获得正在进行中的售后订单数量
     *
     * @param userId 用户编号
     * @param fullOrder 是否按整单计数
     * @return 数量
     */
    Integer getApplyingAfterSaleCountByUserId(Long userId, boolean fullOrder);

    /**
     * 【卖家】获得正在进行中的售后订单数量
     *
     * @param shopId 店铺编号
     * @param fullOrder 是否按整单计数
     * @return 数量
     */
    Integer getApplyingAfterSaleCountByShopId(Long shopId, boolean fullOrder);

}
